/* 使用结构数组
 * 编写一个程序：让用户输入一年内看过的所有电影
 * 要存储每部电影的各种信息：如名片、发行年份、导演、主演、片长、影片的种类、评级等
 * 使用一个结构存储每部电影
 * 一个数组存储一年内看过的电影
 */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TSIZE 45    //存储名片的数组大小
#define FMAX  5     //影片的最大数量

struct film {
    char title[TSIZE];//电影的片名
    int rating;//电影的评分
};

extern char * s_gets(char str[], int lim);

void filmMain1(void)
{
    struct film movies[FMAX];//创建一个结构数组
    int i = 0;//当前输入电影位置
    
    /* 将用户输入的数据存储在数组中
     * 数组已满(FMAX)、达到文件末尾(NULL)、或者按下Enter键('\0')；输入终止
     */
    puts("输入第一部电影标题:");
    while (i < FMAX && s_gets(movies[i].title, TSIZE) != NULL &&
           movies[i].title[0] != '\0')
    {
        puts("输入你的评价等级 <0-10>:");
        scanf("%d", &movies[i++].rating);
        while(getchar() != '\n')
            continue;
        puts("输入下一个电影标题 (遇到空行停止):");
    }
    if (i == 0)
        printf("没有数据输入. ");
    else
        printf ("以下是电影列表:\n");

    
    for (int j = 0; j < i; j++)
        printf("电影: %s  评价: %d\n", movies[j].title,movies[j].rating);
    printf("结束!\n");
}

/* 上述程序有许多缺陷
 * 首先，该程序浪费存储空间；大部分电影名不会超过 40 个字母，但是有些电影名超过 40 个字母
 * 其次，只记录 5 部电影，限制太严格；限制小了无法满足用户需求，限制大了浪费内存
 *
 * 总的来说，该程序的最大问题，就是 数据表示死板、不太灵活
 * 程序在编译时确定所需内存量，其实在运行时确定会更好：
 * 要解决该问题，在运行时，使用动态分配内存表示数据
 *
 */



void filmMain2(void)
{
    long n;
    printf("输入需要存储的最大电影片数量: \n");
    scanf("%ld",&n);
    struct film * movies = (struct film *)malloc(n * sizeof(struct film));//指向结构的指针
    printf("movies %p \n",movies);

    int i = 0;//当前输入电影位置
    
    /* 将用户输入的数据存储在数组中
     * 数组已满(FMAX)、达到文件末尾(NULL)、或者按下Enter键('\0')；输入终止
     */
    puts("输入第一部电影标题:");
    while (i < FMAX && s_gets(movies[i].title, TSIZE) != NULL &&
           movies[i].title[0] != '\0')
    {
        puts("输入你的评价等级 <0-10>:");
        scanf("%d", &movies[i++].rating);
        while(getchar() != '\n')
            continue;
        puts("输入下一个电影标题 (遇到空行停止):");
    }
    if (i == 0)
        printf("没有数据输入. ");
    else
        printf ("以下是电影列表:\n");
    
    
    for (int j = 0; j < i; j++)
        printf("电影: %s  评价: %d\n", movies[j].title,movies[j].rating);
    printf("结束!\n");
}


/* 理想的情况是：
 * 用户可以不确定的添加数据（不断添加数据直到内存用完），而不需要事先指定输入多少项，也不用让程序分配多余的空间
 * 
 */
